package com.gimi.cloud.jimi.manage.service.sys.impl;

import com.gimi.cloud.jimi.common.utils.NumberUtil;
import com.gimi.cloud.jimi.common.utils.StringUtil;
import com.gimi.cloud.jimi.dao.dao.sys.SysMasterDao;
import com.gimi.cloud.jimi.dao.dao.sys.SysMenuDao;
import com.gimi.cloud.jimi.dao.myMapper.core.query.QueryParam;
import com.gimi.cloud.jimi.dto.params.MenuSingleParams;
import com.gimi.cloud.jimi.dto.sys.SysMenuDTO;
import com.gimi.cloud.jimi.entity.sys.SysMasterEntity;
import com.gimi.cloud.jimi.entity.sys.SysMenuEntity;
import com.gimi.cloud.jimi.manage.service.sys.MenuService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class MenuServiceImpl implements MenuService {

    private final SysMenuDao menuDao;
    private final SysMasterDao sysMasterDao;
    private static Logger logger = LoggerFactory.getLogger(MenuServiceImpl.class);

    @Autowired
    public MenuServiceImpl(SysMenuDao menuDao, SysMasterDao sysMasterDao) {
        this.menuDao = menuDao;
        this.sysMasterDao = sysMasterDao;
    }


//    @Override
//    public List<SysMenuDTO> getMenuList() {
//        return menuDao.getMenuList();
//    }

    @Override
    public SysMenuDTO getMenuSingle(MenuSingleParams params) {
        return menuDao.getMenuSingle(NumberUtil.getInt(params.getMenuId()));
    }

//    @Override
//    public List<SysMenuDTO> getMenuListByRoleId(Integer roleId) {
//        return menuDao.getMenuListByRoleId(roleId);
//    }

    /**
     * 通过上级id查询全部菜单
     *
     * @param menuDTO
     * @return
     */
    @Override
    public List<SysMenuDTO> getMenuListByPid(SysMenuDTO menuDTO) {
        Integer mePid = 0;
        if (menuDTO != null && menuDTO.getMeId() != null) {
            mePid = menuDTO.getMeId();
        }
        return menuDao.getMenuListByPid(mePid);
    }

    @Override
    public List<SysMenuDTO> getMenuListReturnAll() {
        List<SysMenuDTO> allList = menuDao.getAllMenuListReturnAllPro();
        List<SysMenuDTO> result = new LinkedList<>();
        for (SysMenuDTO sysMenuDto : allList) {
            if (null != sysMenuDto.getMePid() && 0 == sysMenuDto.getMePid()) {
                initChild(sysMenuDto, allList);
                result.add(sysMenuDto);
            }
        }
        return result;
    }

//    @Override
//    public List<SysMenuDTO> getMenuTree(List<SysMenuDTO> allList, List<SysMenuDTO> authList) {
//        allList = initCheck(allList, authList);
//        return sortMenu(allList);
//    }

    /**
     * 添加菜单
     *
     * @param menuDTO
     * @return
     */
    @Override
    public Boolean menuAdd(SysMenuDTO menuDTO) {
        SysMenuEntity menuEntity = new SysMenuEntity();
        BeanUtils.copyProperties(menuDTO, menuEntity);
        return menuDao.insertSelective(menuEntity) > 0;
    }

    /**
     * 更新菜单
     *
     * @param menuDTO
     * @return
     */
    @Override
    public Boolean menuUpdate(SysMenuDTO menuDTO) {
        SysMenuEntity menuEntity = new SysMenuEntity();
        BeanUtils.copyProperties(menuDTO, menuEntity);
        return menuDao.updateByPrimaryKey(menuEntity) > 0;
    }

    /**
     * 通过主键id删除菜单，同时删除相关下级菜单
     * 通过递归删除：判断当前菜单有无子菜单，存在子菜单进行递归删除，不存在直接删除
     *
     * @param menuDTO
     * @return
     */
    @Override
    public Boolean menuDelete(SysMenuDTO menuDTO) {
        List<SysMenuDTO> menus = menuDao.getMenuListByPid(menuDTO.getMeId());
        if (null != menus && menus.size() > 0) {
            for (SysMenuDTO menu : menus) {
                this.menuDelete(menu);
            }
        }
        //设置删除标识
        menuDTO.setIsDelete(1);
        SysMenuEntity entity = new SysMenuEntity();
        BeanUtils.copyProperties(menuDTO, entity);
        menuDao.updateByPrimaryKey(entity);
        return true;
    }

//    /**
//     * 初始化是否选中
//     *
//     * @param allList  总菜单
//     * @param authList 选中菜单
//     * @return
//     */
//    List<SysMenuDTO> initCheck(List<SysMenuDTO> allList, List<SysMenuDTO> authList) {
//        if (allList != null && allList.size() > 0 && authList != null && authList.size() > 0) {
//            for (SysMenuDTO outer : allList) {
//                for (SysMenuDTO inner : authList) {
//                    if (outer.getMeId() == inner.getMePid()) {
//                        outer.setCheck("1");
//                    } else {
//                        outer.setCheck("0");
//                    }
//                }
//            }
//        }
//        return allList;
//    }

//    @Override
//    public List<SysMenuDTO> sortMenu(List<SysMenuDTO> rootMenu) {
//        List<SysMenuDTO> menuList = new ArrayList<>();
//        for (int i = 0; i < rootMenu.size(); i++) {
//            Integer pId = rootMenu.get(i).getMePid();
//            if (pId != null && pId == 0) {
//                menuList.add(rootMenu.get(i));
//            }
//        }
//        for (SysMenuDTO menu : menuList) {
//            menu.setChilds(getChild(menu.getMeId(), rootMenu));
//        }
//        return menuList;
//    }

    @Override
    public List<SysMenuDTO> getMenuByMasterId(SysMenuDTO dto, Integer maId) {
        SysMasterEntity master = sysMasterDao.queryBy("ma_id", maId);
        if (null == master) {
            return null;
        }
        //避免异常数据产生,如果标识为null，则默认为普通用户
        Integer masterIsAdmin = null == master.getMaIsadmin() ? 0 : master.getMaIsadmin();
        String sql = "";
        //普通管理员
        switch (masterIsAdmin) {
            case -1:
                //超级管理员查看未删除的菜单
                sql = "SELECT menu.* FROM sys_menu menu where menu.is_delete = 0 order BY me_order";
                break;
            case 1:
                //系统管理员查看未删除，且状态为启用的菜单
                sql = "SELECT menu.* FROM sys_menu menu where menu.is_delete = 0 and menu.me_status = 1 order BY me_order";
                break;
            default:
                //普通管理员只查看属于自己的菜单
                sql = "SELECT menu.*" +
                        " FROM sys_menu menu" +
                        " LEFT JOIN sys_authority auth ON menu.me_id = auth.me_id" +
                        " LEFT JOIN sys_role role ON role.is_delete = 0 AND role.ro_id = auth.ro_id" +
                        " LEFT JOIN sys_master_role mr ON mr.ro_id = role.ro_id" +
                        " WHERE menu.is_delete = 0 and menu.me_status = 1 and mr.ma_id = " + maId +
                        " GROUP BY menu.me_id" +
                        " ORDER BY menu.me_order";
                break;
        }
        QueryParam queryParam = new QueryParam();
        queryParam.setSql(sql);
        queryParam.setParamObject(null);
        return menuDao.selectListDTOBySql(queryParam);
    }

    @Override
    public List<SysMenuDTO> menuToTree(List<SysMenuDTO> menuDTOS) {
        List<SysMenuDTO> result = new LinkedList<>();
        for (SysMenuDTO sysMenuDto : menuDTOS) {
            if (null != sysMenuDto.getMePid() && 0 == sysMenuDto.getMePid()) {
                initChild(sysMenuDto, menuDTOS);
                result.add(sysMenuDto);
            }
        }
        return result;
    }
    /**
     * 初始化孩子节点
     * @param dto 父菜单
     * @param sysMenuDtos 所有菜单信息
     */
    private void initChild(SysMenuDTO dto, List<SysMenuDTO> sysMenuDtos) {
        List<SysMenuDTO>  childs = null;
        if (null == dto.getChilds()) {
            childs = new LinkedList<>();
        }
        for (SysMenuDTO sysMenuDto : sysMenuDtos) {
            if (sysMenuDto.getMePid().equals(dto.getMeId())) {
                childs.add(sysMenuDto);
                dto.setChilds(childs);
            }
        }
        if(childs != null && childs.size() > 0){
            for(SysMenuDTO menu:childs){
                initChild(menu, sysMenuDtos);
            }
        }
    }

    @Override
    public Map<String, Object> getPermissions(SysMenuDTO dto, List<SysMenuDTO> menus) {
        Map<String,Object> result = new HashMap<>();
        List<String> permissions = new ArrayList<>();
        List<String> serviceNames = new ArrayList<>();
        for(SysMenuDTO menu:menus){
            if(StringUtil.isNotBlank(menu.getMeServiceName())){
                serviceNames.add(menu.getMeServiceName());
            }
            if(StringUtil.isNotBlank(menu.getMePermission())){
                permissions.add(menu.getMePermission());
            }
        }
        result.put("permissions",permissions);
        result.put("serviceNames",serviceNames);
        return result;
    }

    @Override
    public List<SysMenuDTO> getMenuByRoId(SysMenuDTO dto, Integer roId) {
        if(null == roId){
            return null;
        }
        String sql ="SELECT menu.*,(SELECT count(*) FROM sys_authority WHERE me_id = menu.me_id  AND ro_id = "+roId+") has_auth" +
                " FROM sys_menu menu" +
                " WHERE menu.is_delete = 0 AND menu.me_status = 1" +
                " ORDER BY menu.me_order";
        QueryParam queryParam = new QueryParam();
        queryParam.setSql(sql);
        queryParam.setParamObject(null);
        return menuDao.selectListDTOBySql(queryParam);
    }

//    private List<SysMenuDTO> getChild(Integer id, List<SysMenuDTO> rootMenu) {
//        // 子菜单
//        List<SysMenuDTO> childList = new ArrayList<>();
//        for (SysMenuDTO menu : rootMenu) {
//            // 遍历所有节点，将父菜单id与传过来的id比较
//            if (menu.getMePid() != null) {
//                if (menu.getMePid().equals(id)) {
//                    childList.add(menu);
//                }
//            }
//        }
//        // 把子菜单的子菜单再循环一遍
//        for (SysMenuDTO menu : childList) {
//            if (StringUtils.isBlank(menu.getMeLink())) {
//                menu.setChilds(getChild(menu.getMeId(), rootMenu));// 递归
//            }
//        }
//        if (childList.size() == 0) {
//            // 递归出口
//            return null;
//        }
//        return childList;
//    }

}
